package br.org.acessobrasil.portal.facade;

import java.util.List;

import org.apache.log4j.Logger;

import br.org.acessobrasil.facade.FacadeException;
import br.org.acessobrasil.facade.GenericFacade;
import br.org.acessobrasil.portal.controle.AsesCliente;
import br.org.acessobrasil.portal.modelo.PadraoApresentacao;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.LogDao;
import br.org.acessobrasil.portal.vista.GeraRelatorio;
import br.org.acessobrasil.processoacessibilidade.bo.DesignerCss;
import br.org.acessobrasil.processoacessibilidade.bo.Retificador;


public class PadraoApresentacaoFacade extends GenericFacade<Usuario,PadraoApresentacao>{
	private static Logger logger = Logger.getLogger(PadraoApresentacaoFacade.class);
	private LogDao logDao;
	public LogDao getLogDao() {
		return logDao;
	}
	
	public void setLogDao(LogDao logDao) {
		this.logDao = logDao;
	}
	private boolean estaVazio(String a){
		if (a==null){
			return true;
		}
		if(a.trim().equals("")) return true;
		if(a.equals("N/A")) return true;
		return false;
		
	}

	@Override
	public void excluir(Usuario ator, PadraoApresentacao padraoApresentacao) throws FacadeException {
		padraoApresentacao = getEntityManager().find(PadraoApresentacao.class, padraoApresentacao.getNuPadraoApresentacao());
		if(padraoApresentacao.getListPagina().size()>0){
			throw new FacadeException("Este padr&atilde;o de apresenta&ccedil;&atilde;o n&atilde;o pode ser removido. Existem p�ginas que est&atilde;o utilizando este padr&atilde;o.");
		}
		super.excluir(ator, padraoApresentacao);
		logDao.addLog(ator, "Apagou o template [id=" + padraoApresentacao.getNuPadraoApresentacao()+" nome="+padraoApresentacao.getNoPadrao()+"]");
		logger.info("Apagou o template [id=" + padraoApresentacao.getNuPadraoApresentacao()+" nome="+padraoApresentacao.getNoPadrao()+"]");
	}
	
	public PadraoApresentacao atualizar(Usuario ator, PadraoApresentacao obj, boolean acessibilizarAutomaticamente) throws FacadeException,ErroAcessibilidadeException {
		//restaura possiveis mudan�as no padrao original
		obj.setDePadraoApresentacao(buscar(ator, obj.getNuPadraoApresentacao()).getDePadraoApresentacao());
		if(acessibilizarAutomaticamente && obj.getDePadraoTemp()!=null){
			String codigo = acessibilizarCodigoAutomaticamente(obj.getDePadraoTemp());
			obj.setDePadraoTemp(codigo);
		}
		String errosAcessibilidade = validarAcessibilidade(ator, obj);
		if(errosAcessibilidade!=null){
			ErroAcessibilidadeException e = new ErroAcessibilidadeException("Erro de acessibilidade");
			e.setDetalhes(errosAcessibilidade);
			logDao.addLog(ator, "Atualizou o template [id=" + obj.getNuPadraoApresentacao()+" nome="+obj.getNoPadrao()+"]");
			obj.setStSituacao('a');//forcando estar com erro
			super.atualizar(ator, obj);
			throw e;
		}else{
			logDao.addLog(ator, "Atualizou o template [id=" + obj.getNuPadraoApresentacao()+" nome="+obj.getNoPadrao()+"]");
			return super.atualizar(ator, obj);			
		}
	}
	
	public String validarAcessibilidade(Usuario ator,PadraoApresentacao obj) throws FacadeException{
		AsesCliente avaliador = new AsesCliente();
		avaliador.avalia(obj.getDePadraoApresentacao());
		
		AsesCliente avaliadorTemp = new AsesCliente();
		avaliadorTemp.avalia(obj.getDePadraoTemp()==null ? "" : obj.getDePadraoTemp());
		
		if(!estaVazio(obj.getDePadraoTemp())){
			if(avaliadorTemp.isErrado()){
				obj.setStSituacao('a');
				return GeraRelatorio.getHtml(avaliadorTemp.getRelatorio(),"N/A");
			}else{
				obj.setDePadraoApresentacao(obj.getDePadraoTemp());
				obj.setStSituacao('p');
			}
		}else if(!estaVazio(obj.getDePadraoApresentacao())){
			if(avaliador.isErrado()){
				obj.setStSituacao('a');
				return GeraRelatorio.getHtml(avaliador.getRelatorio(),"");
			}else{
				obj.setStSituacao('p');
				obj.setDePadraoTemp(obj.getDePadraoApresentacao());
			}
		}
		return null;
	}
	
	public static String acessibilizarCodigoAutomaticamente(String codigoHtml){
		Retificador retificador = new Retificador();
		retificador.setColocarDocType(true);
		DesignerCss designerCss = new DesignerCss();
		String codHtml=retificador.consertarErroAcessibilidade(codigoHtml);
		codHtml=retificador.consertarErroHtml(codHtml);
		////retira os cssInline
		codHtml = designerCss.retirarCssInline(codHtml, "arquivo atual");
		return codHtml;
	}
	
	/**
	 * Cria o padrao/template
	 * @param ator usuario
	 * @param obj padrao
	 * @param acessibilizarAutomaticamente true para tentar acessibilizar
	 * @throws FacadeException caso ocorra algum erro
	 */
	public void criar(Usuario ator, PadraoApresentacao obj, boolean acessibilizarAutomaticamente)throws FacadeException {
		if(acessibilizarAutomaticamente && obj.getDePadraoTemp()!=null){
			String codigo = acessibilizarCodigoAutomaticamente(obj.getDePadraoTemp());
			obj.setDePadraoTemp(codigo);
		}
		
			String errosAcessibilidade = validarAcessibilidade(ator, obj);
		if(errosAcessibilidade!=null){
			ErroAcessibilidadeException e = new ErroAcessibilidadeException("Erro de acessibilidade");
			e.setDetalhes(errosAcessibilidade);
			super.criar(ator, obj);
			logDao.addLog(ator, "Criou o template [id=" + obj.getNuPadraoApresentacao()+" nome="+obj.getNoPadrao()+"]");
			throw e;
		}else{
			logDao.addLog(ator, "Criou o template [id=" + obj.getNuPadraoApresentacao()+" nome="+obj.getNoPadrao()+"]");
			super.criar(ator, obj);
		}
	}
	
	
	@SuppressWarnings("unchecked")
	public List<PadraoApresentacao> listar(Sitio sitioAtual) {
		return getEntityManager().createQuery("Select o From PadraoApresentacao o where o.sitio.nu_sitio=?").setParameter(1, sitioAtual.getNuSitio()).getResultList();
	}
	
}
